<?php
class House_Controller extends Base_Controller
{
    public $restful = true;

    public function __construct()
    {
        parent::__construct();
        $this->filter('before', 'auth')->except(array('index', 'view', 'search'));
    }

    public function get_index()
    {

        $data = House::order_by('updated_at', 'desc')
            ->paginate(setting('houses_per_page'));
        $pagination = $data->speaks('vi')->links(2);
        $houses = $data->results;
        $current_page = $data->page;
        $view = View::make('house.index', compact('houses', 'pagination', 'current_page'));


        return $view;
    }

    public function get_post()
    {
        if (House::post_able()) {
            return view('house.post');
        } else {
            return error('Bạn đã đăng quá số lượng nhà trọ cho phép!', 'Giới hạn', action('house@manage'));
        }
    }

    public function post_post()
    {
        $data = array_only(Input::get(), array(
            'house_name', 'intro',
            'opening_hour', 'closing_hour',
            'city_id', 'district_id', 'ward_id', 'house_address',
            'house_position', 'anchor_id'
        ));
        $rules = array(
            'house_name' => 'required|min:4|max: 128',
            'house_address' => 'required|min:4|max:128',
        );
        $validator = Validator::make($data, $rules);

        if ($validator->fails()) {
            return Redirect::to(URI::current())
                ->with_errors($validator->errors)
                ->with_input();
        }

        if ($data['anchor_id'] === '') {
            $data['anchor_id'] = -1;
        }

        $house = MyAuth::user()->houses()->insert(array_only($data, array(
            'house_name', 'house_address', 'ward_id',
            'anchor_id', 'opening_hour', 'closing_hour',
            'intro', 'house_position'
        )));

        return message_page(array(
            'content' => 'Đăng nhà trọ mới thành công!',
            'redirect_url' => $house->url
        ));
    }

    public function get_view($id, $slug = null)
    {
        $house = House::find($id);

        if (is_not_null($house)) {
            return view('house.view', compact('house'));
        } else {
            return error('Nhà trọ yêu cầu không tồn tại!', 'Lỗi truy cập', action('house@index'));
        }
    }


    public function get_update($id = -1)
    {
        $house = House::find($id);
        if (is_not_null($house)) {
            if (MyAuth::admin() || MyAuth::user()->id === $house->user_id) {
                $city_id = $house->ward->district->city_id;
                $district_id = $house->ward->district_id;
                $anchor_name = $house->anchor->anchor_name;
                $data = array_merge($house->to_array(), compact('city_id', 'district_id', 'anchor_name'));
                return view('house.post')
                    ->with('house', (object) $data)
                    ->with('updating', true);
            } else {
                return message_page(array(
                    'content' => 'Không đủ quyền cập nhật nhà trọ này!',
                    'type' => 'error',
                    'title' => 'Truy cập bị từ chối'
                ));
            }
        } else {
            return message_page(array(
                'content' => 'Liên kết không chứa đủ thông tin để cập nhật nhà trọ!',
                'type' => 'error'
            ));
        }
    }

    public function post_update()
    {
        $house = House::find(Input::get('id'));
        if (is_not_null($house)) {
            if (MyAuth::admin() || MyAuth::user()->id === $house->user_id) {
                $data = array_only(Input::get(), array(
                    'house_name', 'intro',
                    'opening_hour', 'closing_hour',
                    'ward_id', 'house_address',
                    'house_position', 'anchor_id'
                ));


                $rules = array(
                    'house_name' => 'required|min:4|max: 128',
                    'house_address' => 'required|min:4|max:128',
                );
                $validator = Validator::make($data, $rules);

                if ($validator->fails()) {
                    return Redirect::to(action('house@update', array('id' => $house->id)))
                        ->with_errors($validator->errors)
                        ->with_input();
                }

                if ($data['anchor_id'] === '') {
                    $data['anchor_id'] = -1;
                }

                $house->fill($data)->save();



                return message_page(array(
                    'content' => 'Cập nhật nhà trọ thành công!',
                    'redirect_url' => $house->url
                ));
            } else {
                return message_page(array(
                    'content' => 'Không đủ quyền cập nhật nhà trọ này!',
                    'type' => 'error',
                    'title' => 'Truy cập bị từ chối'
                ));
            }
        } else {
            return message_page(array(
                'content' => 'Nhà trọ yêu cầu cập nhật không tồn tại!',
                'type' => 'error'
            ));
        }
    }

    public function get_manage()
    {
        $title = 'Quản lý nhà trọ';
        $data = MyAuth::user()->houses()->paginate(4);
        $houses = $data->results;
        $pagination = $data->speaks('vi')->links(2);
        return view('house.manage', compact('title', 'houses', 'pagination'));
    }

    public function get_delete($id)
    {
        if (!$this->is_privileges_with_house($id)) {
            return error('Không đủ quyền xóa nhà trọ này', 'Truy cập bị từ chối',
                action('house@manage'));
        }

        pre_login_url(Request::referrer());

        $house = House::find($id);
        return confirm("Bạn muốn xóa nhà trọ <strong>{$house->house_name}</strong>?", 'Xác nhận xóa',
            action('house@delete', array($id)), pre_login_url());
    }

    public function post_delete($id)
    {
        if (!$this->is_privileges_with_house($id)) {
            return error('Không đủ quyền xóa nhà trọ này', 'Truy cập bị từ chối',
                action('house@manage'));
        }
        House::find($id)->delete();
        return message('Xóa nhà trọ hoàn tất', 'Xóa', action('house@manage'));
    }

    public function get_images($id)
    {
        $house = House::find($id);
        if (MyAuth::has_house_privileges($id)) {
            return view('house.images', compact('house'));
        } else {
            return error("Không đủ quyền sử dụng chức năng này!");
        }
    }

    public function post_images_upload($id)
    {
        $house = House::find($id);
        if (MyAuth::has_house_privileges($id)) {
            $validator = Validator::make(Input::all(), array(
                //'image_file' => 'image',
            ));
            if ($validator->fails() || !preg_match('/^$|\.(jpg|png|gif)$/mi', Input::get('file_url'))) {
                return error('Định dạng tập tin tải lên không phù hợp!', 'Lỗi tập tin', Request::referrer());
            };

            $file = Input::get('image_url');
            if (Input::has_file('image_file')) {
                $file = time() . Input::file('image_file.name');

                if (Input::file('image_file.size') > setting('image_size_limit')) {
                    return error('Dung lượng tập tin lớn hơn giới hạn cho phép (' .  get_file_size(setting('image_size_limit')) .
                        ')!', 'Quá giới hạn', action('house@images', array($id)));
                }
                Input::upload('image_file', path('public') . 'img/photos/', $file
                );
            }
            $house->images()->insert(
                array('image_url' => 'img/photos/' . $file));
            return message('Thêm ảnh cho nhà trọ  thành công!', 'thêm ảnh', Request::referrer());
        } else {
            return error("Không đủ quyền sử dụng chức năng này!");
        }
    }

    public function post_images_delete($image_id)
    {
        $img = Image::find($image_id);
        if (is_not_null($img) && MyAuth::has_house_privileges($img->house_id)) {
            if (!starts_with($img->image_url, 'http')) {
                File::delete(path('public') . $img->image_url);
            }
            $img->delete();
            if (Request::ajax()) {
                return Response::json(array('code' => 1));
            } else {
                return message('Xóa ảnh thành công!', 'Xóa ảnh', action('house@manage'));
            }
        } else {
            if (Request::ajax()) {
                return Response::json(array('code' => -1));
            } else {
                error("Không đủ quyền trên nhà trọ này", 'truy cập bị từ chối');
            }
        }
    }

    public function get_search()
    {
        $query = House::where('house_name', 'LIKE', DB::raw('\'%' . Input::get('ten-nha-tro') . '%\''));

        $wards_t = Ward::all();


        if (Input::get('thanh-pho') > -1) {
            $wards_t = Ward::all_by_city(Input::get('thanh-pho'));
        }

        if (Input::get('quan') > -1 ) {
            $wards_t = Ward::all_by_district(Input::get('quan'));
        }

        if (Input::get('phuong') > -1) {
            $wards_t = Ward::where_id(Input::get('phuong'))->get();
        }

        $wards = array();
        array_map(function ($e) use (&$wards) {
            $wards[] = $e->id;
        }, $wards_t);


        // Lấy các phòng trọ theo yêu cầu về giá, internet ...
        $rooms = Room::where(DB::raw('1'), '=', '1');
        if (is_numeric(Input::get('gia-cao-nhat'))) {
            $rooms = Room::where('price', '<=', Input::get('gia-cao-nhat'));
        }
        if (Input::has('internet')) {
            $rooms->where_internet(true);
        }
        if (Input::has('tv')) {
            $rooms->where_tv(true);
        }
        if (Input::has('gac')) {
            $rooms->where_garret(true);
        }
        if (Input::has_file('dieu-hoa')) {
            $rooms->where_air_condition(true);
        }

        $rooms = $rooms->get();
        $houses_id = array();
        array_map(function ($e) use (&$houses_id) {
            $houses_id[] = $e->house_id;
        }, $rooms);

        if (count($wards) > 0) {
            $query->where_in('ward_id', $wards);
        }

        $houses = array();
        $pagination = '';
        $current_page = 1;

        if (count($houses_id) > 0) {

            $query = $query->where_in('id', $houses_id)->paginate(setting('houses_per_page'));
            $houses = $query->results;
            $pagination = $query->speaks('vi')->links(2);
            $current_page = $query->page;
        }

        $search = true;

        return view('house.index', compact('houses', 'pagination', 'current_page', 'search'));
    }

    private function is_privileges_with_house($id)
    {
        $house = House::find($id);
        return is_not_null($house) &&
            (MyAuth::check() || MyAuth::admin() || MyAuth::user()->id == $house->user_id);
    }

}